import { defineConfig } from 'eslint/config'
import globals from 'globals'
import js from '@eslint/js'
import pluginVue from 'eslint-plugin-vue'


export default defineConfig([
  { files: ['**/*.{js,mjs,cjs,vue}'] },
  { files: ['**/*.{js,mjs,cjs,vue}'], languageOptions: { globals: globals.browser } },
  { files: ['**/*.{js,mjs,cjs,vue}'], plugins: { js }, extends: ['js/recommended'] },
  pluginVue.configs['flat/essential'],
  // 自定义规则（全局或按文件类型）
  {
    // 全局规则（适用于所有文件）
    rules: {
      // 缩进与符号
      'no-console': 'warn', // 禁止 console，警告级别
      'semi': ['error', 'never'], // 不允许分号
      'quotes': ['error', 'single'], // 强制双引号
      'indent': ['error', 2], // 2 空格缩进
      // 对象与数组
      'comma-dangle': ['error', 'never'], // 禁止末尾逗号‌
      'object-curly-spacing': ['error', 'always'], // 对象花括号内空格‌
      // 换行风格
      'function-paren-newline': ['error', 'multiline'], // 多行参数换行‌
      'array-bracket-newline': ['error', 'consistent']  // 数组元素换行一致性‌
    }
  },
  {
    // 仅针对 Vue 文件的规则
    files: ['**/*.vue'],
    rules: {
      // 强制第一个属性换行（关键配置）
      'vue/first-attribute-linebreak': ['error', {
        singleline: 'ignore',  // 单行模式下不限制
        multiline: 'below'      // 多行模式下首属性必须换行
      }],
      // 强制闭合标签的括号换行
      'vue/html-closing-bracket-newline': ['error', {
        singleline: 'never',   // 单行标签闭合括号不换行
        multiline: 'always'    // 多行标签闭合括号必须换行
      }],
      // 强制属性换行后缩进
      'vue/html-indent': ['error', 2, {
        attribute: 1,         // 属性相对标签缩进 1 级（2 空格）
        baseIndent: 1,        // 根节点缩进 1 级（2 空格）
        closeBracket: 0,      // 闭合标签不额外缩进
        ignores: []           // 无例外情况
      }],
      'vue/multi-word-component-names': 'off', // 关闭组件名必须多单词
      // 模板规范
      'vue/html-self-closing': ['error', {
        'html': { 'void': 'always' } // 空标签强制自闭合‌
      }],
      'vue/max-attributes-per-line': ['error', {
        'singleline': {
          'max': 1
        },
        'multiline': {
          'max': 1
        }
      }]
    }
  }
])